package com.tron.nettychat.nettysocket;

import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;

public class TronServerInitializer extends ChannelInitializer<Channel> {
    @Override
    protected void initChannel(Channel ch) throws Exception {
        ch.pipeline()
                /**
                 * 将字节解码为HttpRequest、HttpContent 和LastHttp-Content。
                 * 并将HttpRequest、HttpContent 和Last-HttpContent 编码为字节
                 */
                .addLast("httpCodec",new HttpServerCodec())
                /**
                 * 以块的方式写的处理器
                 */
                .addLast(new ChunkedWriteHandler())
                /**
                 * 将一个HttpMessage 和跟随它的多个HttpContent 聚合为单个FullHttpRequest 或者FullHttpResponse（取决于它是被用来处理请求还是响应）。安装了这个之后，
                 * ChannelPipeline 中的下一个ChannelHandler 将只会收到完整的HTTP 请求或响应
                 */
                .addLast(new HttpObjectAggregator(64 * 1024))
                /**
                 * 处理TextWebSocketFrame 和握手完成事件
                 */
                .addLast(new TronTextWebSocketFrameHandler())
                /**
                 * 按照WebSocket 规范的要求，处理WebSocket 升级握手、保持长链接
                 * 处理WebSocketFrame数据类型 帧(Frame)
                 * 当浏览器以ws://ip+port/websocket请求时做处理
                 */
                .addLast(new WebSocketServerProtocolHandler("/websocket"))

                ;
    }
}
